package inner;

import com.sun.org.apache.bcel.internal.classfile.InnerClass;

/**
 * Created with IntelliJ IDEA.
 * Description：
 * User：user
 * DATE:2021-11-13
 * Time:15:08
 */

/*
内部类：
本地内部类：方法里边定义类

实例内部类：
静态内部类：
匿名内部类：

以后说内部类的时候记得带上前缀
 */
/*class OutClass{

    public  int data1 = 1;
    private  int data2 = 2;
    public  static  int data3 = 3;

    public void func(){
        //static final  int a = 10;
    }

    *//*
    实例内部类【实例的"成员"】
    1.在实例内部类当中，为什么不能定义静态的成员变量？语法不支持  相当于在实例大的成员方法中不能定义静态的，需要定义一个在编译时期就要确定的final
    2.获取实例内部类的对象：
        OutClass outClass = new OutClass();
        OutClass.innerClass innerClass = outClass.new innerClass();//获取实力内部类对象
     3.实例内部类当中会包含外部类的this
     4.生成的实例内部类，类名是外部类$内部类类名.class
     5.实例内部类开销比较大，每次获取实例内部类对象必须有一个外部类对象
     *//*

    class innerClass{
        public int data1 = 99;
        public  int data4 = 4;
        public  int data5 = 5;
        public  static final int data6 = 6;

        public  OutClass out = new OutClass();

        public  void  func(){
            System.out.println("InnerClass::func()");
            System.out.println(data1);//就近原则访问的是内部类data1
            System.out.println(out.data1);//定义外部类引用访问内部类的data1
            System.out.println(this.data1);//内部类的this
            System.out.println(OutClass.this.data1);//外部类的this

            System.out.println(data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
        }

    }

}*/

class OutClass{

    public  int data1 = 1;
    private  int data2 = 2;
    public  static  int data3 = 3;

    public void func(){
        //static final  int a = 10;
    }
    /*
    静态内部类：【静态的成员】
    1.如何获取静态内部类的实例对象
    OutClass.InnerClass innerClass = new OutClass.InnerClass();
    2.如何访问静态内部类当中的，外部类的实例数据成员
    System.out.println(out.data1);//外部类的this
    System.out.println(out.data2);//静态内部类中无法访问外部类成员变量
     */

     static class InnerClass{
        public int data1 = 99;
        public  int data4 = 4;
        public  int data5 = 5;
        public  static final int data6 = 6;
         public  static  int data7 = 6;

        public  OutClass out = new OutClass();

        public  void  func(){
            System.out.println("InnerClass::func()");
            System.out.println(data1);//就近原则访问的是内部类data1
            System.out.println(out.data1);//定义外部类引用访问内部类的data1
            System.out.println(this.data1);//内部类的this
            System.out.println(out.data1);//外部类的this

            System.out.println(out.data2);//静态内部类中无法访问外部类成员变量
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
        }

    }

}
class  Out{
    public  void func(){
        System.out.println("out:func()");
    }
}
public class Test {

    public static void main(String[] args) {
        int c =  99;
        new Out();//匿名对象
        new Out(){
            int a = 10;
            //a = 99;  //无法改变
            //c = 88;  //无法改变也会报错
            //捕获的是常量或者是没有修改的量
            public  void  func(){
                System.out.println("匿名内部类的func()");
                System.out.println(a);
            }
        }.func();//匿名内部类
    }

    public static void main2(String[] args) {
        OutClass.InnerClass innerClass = new OutClass.InnerClass();
        innerClass.func();
    }
   /* public static void main1(String[] args) {
        OutClass outClass = new OutClass();
        OutClass.innerClass innerClass = outClass.new innerClass();//获取实力内部类对象
        innerClass.func();
    }*/
}
